package Controller;

import Model.Congreso; 
import Model.Cliente; 
import Model.Pedido;
import Servicio.Proxy;
import Servicio.Impresora;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.logging.Level;
import java.util.logging.Logger;


public class RPedidoController {
    private ArrayList<Congreso> mCongresos;
    private ArrayList<Cliente> mClientes; 
    private ArrayList<Integer> mDvds;
    private ArrayList<String> mApellidos;
    private ArrayList<String> mEspecialidades;
    private ArrayList<String> mLocalidades;
    private ArrayList<String> mProvincias;
    private ArrayList<String> mPaises;
    private Congreso mCongreso;
    private Cliente mCliente;
    private Pedido mPedido;
    
    
    
    /**Constructor de RPedidoControler*/
    public RPedidoController () {
         mCongresos = new ArrayList();
         mClientes = new ArrayList();
         mApellidos = new ArrayList();
        
     }

    public void imprimirComprobante(String nroComp,String nombre, String direccion, ArrayList<Integer> dvd,String fecha,String total,String seña,String saldo, String cong ){
    
        PrinterJob job = PrinterJob.getPrinterJob(); 
      
        Impresora imp=new Impresora(); 
        
        
        String diaI = fecha.substring(8, 10);  
        String mesI = fecha.substring(5, 7);
        String anioI = fecha.substring(0, 4);
        String fecha2 = diaI+"/"+mesI+"/"+anioI;
        
        
        imp.getCadenaImpresora().add(nroComp);
        imp.getCadenaImpresora().add(nombre);
        imp.getCadenaImpresora().add(direccion);
        imp.getCadenaImpresora().add("nada");
        imp.getCadenaImpresora().add(fecha2);
        imp.getCadenaImpresora().add(total);
        imp.getCadenaImpresora().add(seña);
        imp.getCadenaImpresora().add(saldo);
        imp.getCadenaImpresora().add(cong);
        imp.setDvd2(dvd);
        java.awt.print.PageFormat format = new java.awt.print.PageFormat();
        java.awt.print.Paper paper = new java.awt.print.Paper();
        paper.setSize(100, 1000);
        paper.setImageableArea(0, 0, 200, 1000);
       // System.out.println(paper.getImageableX());
       // System.out.println(paper.getImageableHeight());
        format.setPaper(paper);
        job.setPrintable(imp, format);
       // job.setPrintable(imp); 
     try {

            job.print();
        } catch (PrinterException ex) {
            Logger.getLogger(RPedidoController.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }
    
  
        public void imprimirRecibo(String nroComp,String nombre, String fecha,String total, String cong ){
    
        PrinterJob job = PrinterJob.getPrinterJob(); 
      
        Impresora imp=new Impresora(); 
        
        String diaI = fecha.substring(8, 10);  
        String mesI = fecha.substring(5, 7);
        String anioI = fecha.substring(0, 4);
        String fecha2 = diaI+"/"+mesI+"/"+anioI;
        
        
        imp.getCadenaImpresora3().add(nroComp);
        imp.getCadenaImpresora3().add(nombre);
        imp.getCadenaImpresora3().add(fecha2);
        imp.getCadenaImpresora3().add(total);
        imp.getCadenaImpresora3().add(cong);
        java.awt.print.PageFormat format = new java.awt.print.PageFormat();
        java.awt.print.Paper paper = new java.awt.print.Paper();
        paper.setSize(100, 1000);
        paper.setImageableArea(0, 0, 200, 1000);
        format.setPaper(paper);
        job.setPrintable(imp, format);
     try {

            job.print();
        } catch (PrinterException ex) {
            Logger.getLogger(RPedidoController.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }
    
    public ArrayList<Congreso> getCongresos () {
        return mCongresos;
    }
 
    public void setCongresos (ArrayList<Congreso> val) {
        this.mCongresos = val;
    }
    
    public ArrayList<String> getEspecialidades () {
        return mEspecialidades;
    }
 
    public void setEspecialidades (ArrayList<String> val) {
        this.mEspecialidades = val;
    }
    
    public ArrayList<String> getLocalidades () {
        return mLocalidades;
    }
 
    public void setLocalidades (ArrayList<String> val) {
        this.mLocalidades = val;
    }
    
    public ArrayList<String> getProvincias () {
        return mProvincias;
    }
 
    public void setProvincias (ArrayList<String> val) {
        this.mProvincias = val;
    }
    
    public ArrayList<String> getPaises () {
        return mPaises;
    }
 
    public void setPaises (ArrayList<String> val) {
        this.mPaises = val;
    }
    
    public ArrayList<Cliente> getClientes () {
        return mClientes;
    }
  
    public void setClientes (ArrayList<Cliente> val) {
        this.mClientes = val;
    }
    
    public ArrayList<String> getApellidos () {
        return mApellidos;
    }
    
    public void setApellidos (ArrayList<String> val) {
        this.mApellidos = val;
    }
    
    public Congreso getCongreso(){
        return mCongreso;
    }
    
    public void setCongreso(Congreso val){
        this.mCongreso = val;
    }
    
    public Cliente getCliente(){
        return mCliente;
    }
    
    public void setCliente(Cliente val){
        this.mCliente = val;
    }
     
    
    public Pedido getPedido(){
        return mPedido;
    }
    
    public void setPedido(Pedido val){
        this.mPedido = val;
    }
    
    public ArrayList<Integer> getDvds () {
        return mDvds;
    }
  
    public void setDvds (ArrayList<Integer> val) {
        this.mDvds = val;
    }
   
     /**Carga el arrayList con los Congresos*/
    public  void cargarCongresos(){
        this.setCongresos(Proxy.obtenerCongresos());
        //this.mCongresos.remove(this.mCongresos.size()-1);
        
    }
   
    public  void cargarEspecialidades(){
        this.setEspecialidades(Proxy.obtenerConjuntoExpandible(4));
        this.mEspecialidades.remove(this.mEspecialidades.size()-1);
        
    }
    
    public  void cargarLocalidades(){
        this.setLocalidades(Proxy.obtenerConjuntoExpandible(5));
        this.mLocalidades.remove(this.mLocalidades.size()-1);
        
    }
    
    public  void cargarProvincias(){
        this.setProvincias(Proxy.obtenerConjuntoExpandible(6));
        this.mProvincias.remove(this.mProvincias.size()-1);
        
    }
    
    public  void cargarPaises(){
        this.setPaises(Proxy.obtenerConjuntoExpandible(7));
        this.mPaises.remove(this.mPaises.size()-1);
        
    }
    /**Carga el combo con todos los congresos disponibles*/
    public void cargarClientes () {
        this.setClientes(Proxy.obtenerClientes());
    } 
    
    public void cargarApellidos () {
        this.setApellidos(Proxy.obtenerApellidos());
    }
    
    // Este metodo va a volar 
    public Congreso cargarCongreso () {
        return null;
      }

    public int aceptarPedido () {
        mPedido.setCliente(mCliente);
        mPedido.setCongreso(mCongreso);
        mPedido.setDVDs(mDvds);
        mPedido.getDVDs().size();
        
        if (Proxy.almacenarPedido(mPedido)){
            
        
        if (mPedido.getEnvio().compareTo("si") == 0 || avisarEnQueCaja()==false ){
            //Aca adentro de este if deberia sacar del stock de la oficina en vez de sacar del stock del congreso.
            //Y sino entra en el else y lo saca del otro.
            Congreso Oficina = new Congreso();
            //Oficina = Proxy.obtenerCongreso("OFICE", "01012000");
            for(int i=mCongresos.size()-1;i>=0;i--){
                if (mCongresos.get(i).getIniciales().compareTo("OFICE") == 0){
                    Oficina = mCongresos.get(i);
                }
            }
            if (mPedido.getDVDs().size() <= Oficina.getStockDvd()){
                Oficina.setStockDvd(Oficina.getStockDvd()-mPedido.getDVDs().size());
                Proxy.modificarCongreso(Oficina);
                
                return 1; // Devuelve 1 cuando la cantidad es correcta
            }else{
                Oficina.setStockDvd(Oficina.getStockDvd()-mPedido.getDVDs().size());
                Proxy.modificarCongreso(Oficina);
                
                return 0; // devuelve 0 cuando el stock es menor a la cant de dvds que se piden...
            }
        } else{
        
           
            if (mPedido.getDVDs().size() <= mCongreso.getStockDvd()){
                mCongreso.setStockDvd(mCongreso.getStockDvd()-mPedido.getDVDs().size());
                Proxy.modificarCongreso(mCongreso);
                
                return 1; // Devuelve 1 cuando la cantidad es correcta
            }else{
                mCongreso.setStockDvd(mCongreso.getStockDvd()-mPedido.getDVDs().size());
                Proxy.modificarCongreso(mCongreso);
                
                return 0; // devuelve 0 cuando el stock es menor a la cant de dvds que se piden...
            }
        }}else{
            return 2; // devuelve 2 si el proxy devolvio falso. en este caso no se hizo nada.
        }
    }
    

    //Agrega un cliente a la Base de datos
    public void agregarCliente () {
        Proxy.almacenarCliente(mCliente);
    
    }
    
    
    public void imprimirComprobantes () {
    }
    public void cargadatosCombo(javax.swing.JComboBox combo, ArrayList<String> listaDato){
               combo.removeAllItems();
               combo.addItem("");
               for (int i = 0; i <  listaDato.size(); i++) {
                   combo.addItem( listaDato.get(i));
               }
      }
    
    public void cargaCombos(final javax.swing.JComboBox combo, final ArrayList<String> listaDato){
        combo.getEditor().getEditorComponent().addKeyListener(new KeyAdapter() { public void keyReleased(KeyEvent e) {
            if (e.getKeyCode() != 38 && e.getKeyCode() != 40 && e.getKeyCode() != 10) {
                String aC = combo.getEditor().getItem().toString();
                String a = aC.toLowerCase();
                String aux;
                combo.removeAllItems();
                int st = 0;
                for (int i = 0; i <  listaDato.size(); i++) {
                    aux=listaDato.get(i).toLowerCase();
                    if (aux.startsWith(a)) { combo.addItem( listaDato.get(i)); st++; }
                }
                combo.getEditor().setItem(new String(aC));
                combo.hidePopup();
                if (st != 0) { combo.showPopup(); }
            }
        } } );}
    
    
    private boolean avisarEnQueCaja(){
    boolean error = false;
   Calendar calendar = Calendar.getInstance();
   Calendar fechaFin = Calendar.getInstance();
   Calendar fechaAct = Calendar.getInstance();
   Calendar fechaIni = Calendar.getInstance();
   
   int anioI = Integer.parseInt(mCongreso.getFechaInicio().substring(0,4));
   int mesI = Integer.parseInt(mCongreso.getFechaInicio().substring(5,7));
   int diaI = Integer.parseInt(mCongreso.getFechaInicio().substring(8,10));
   
   
   int anioF = Integer.parseInt(mCongreso.getFechaFin().substring(0,4));
   int mesF = Integer.parseInt(mCongreso.getFechaFin().substring(5,7));
   int diaF = Integer.parseInt(mCongreso.getFechaFin().substring(8,10));
   
   int anioA = calendar.get(Calendar.YEAR);
   int mesA = calendar.get(Calendar.MONTH) + 1;
   int diaA = calendar.get(Calendar.DAY_OF_MONTH);
   
   fechaIni.set(anioI, mesI, diaI);
   fechaFin.set(anioF, mesF, diaF);
   fechaAct.set(anioA, mesA, diaA);
   
   /*   true = caja del congreso
         false = caja de Oficina   */
    if (fechaIni.compareTo(fechaAct) <= 0  &&  fechaFin.compareTo(fechaAct) >= 0 )
           error = true;
    

    return error;
}
}

